home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dobj / reloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-09  |  2.5 KB  |  132 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  RELOC.C
  9.  *
  10.  */
  11.  
  12. #include "defs.h"
  13.  
  14. Prototype void rel_init(void);
  15. Prototype void ResetReloc(void);
  16. Prototype void AddRelocInfo(short srcHunk, short dstHunk, long size, short flags, long offset, Symbol *sym);
  17. Prototype RelocInfo *FindRelocOffset(long offset, short hunkNo);
  18. Prototype RelocInfo *FindRelocNext(RelocInfo *rel);
  19. Prototype int LoadRelocData(FILE *fi, RelocInfo *r);
  20.  
  21. List    RelList;
  22. RelocInfo   *RelOffCache;
  23.  
  24. void
  25. rel_init(void)
  26. {
  27.     NewList(&RelList);
  28. }
  29.  
  30. void
  31. ResetReloc(void)
  32. {
  33.     RelocInfo *r;
  34.  
  35.     if (RelList.lh_Head == NULL)
  36.     cerror(EFATAL, "Software Error, ResetReloc");
  37.  
  38.     while ((r = RemHead(&RelList)) != NULL)
  39.     free(r);
  40.     RelOffCache = NULL;
  41. }
  42.  
  43. void
  44. AddRelocInfo(short srcHunk, short dstHunk, long size, short flags, long offset, Symbol *sym)
  45. {
  46.     RelocInfo *ri = malloc(sizeof(RelocInfo));
  47.     RelocInfo *r;
  48.  
  49.     if (ri == NULL)
  50.     cerror(EFATAL, "malloc Failed");
  51.  
  52.     clrmem(ri, sizeof(RelocInfo));
  53.     ri->ri_Sym = sym;
  54.     ri->ri_SrcHunk = srcHunk;
  55.     ri->ri_DstHunk = dstHunk;
  56.     ri->ri_RelocSize = size;
  57.     ri->ri_RelocFlags= flags;
  58.     ri->ri_SrcOffset = offset;
  59.  
  60.     for (r = GetTail(&RelList); r; r = GetPred((Node *)&r->ri_Node)) {
  61.     if (r->ri_SrcOffset < ri->ri_SrcOffset)
  62.         break;
  63.     }
  64.     Insert(&RelList, (Node *)&ri->ri_Node, (Node *)&r->ri_Node);
  65. }
  66.  
  67. RelocInfo *
  68. FindRelocOffset(long offset, short hunkNo)
  69. {
  70.     RelocInfo *r = RelOffCache;
  71.  
  72.     if (r == NULL)
  73.     r = GetHead(&RelList);
  74.  
  75.     while (r && r->ri_SrcOffset >= offset)
  76.     r = GetPred((Node *)&r->ri_Node);
  77.  
  78.     if (r == NULL)
  79.     r = GetHead(&RelList);
  80.  
  81.     while (r && r->ri_SrcOffset < offset)
  82.     r = GetSucc((Node *)&r->ri_Node);
  83.  
  84.     while (r && r->ri_SrcHunk != hunkNo)
  85.     r = GetSucc((Node *)&r->ri_Node);
  86.  
  87.     if (r)
  88.     RelOffCache = r;
  89.  
  90.     return(r);
  91. }
  92.  
  93. RelocInfo *
  94. FindRelocNext(RelocInfo *rel)
  95. {
  96.     RelocInfo *r;
  97.  
  98.     for (r = GetSucc((Node *)&rel->ri_Node); r && r->ri_SrcHunk != rel->ri_SrcHunk; r = GetSucc((Node *)&r->ri_Node));
  99.     return(r);
  100. }
  101.  
  102. int
  103. LoadRelocData(FILE *fi, RelocInfo *r)
  104. {
  105.     switch(r->ri_RelocSize) {
  106.     case 0:
  107.     return(0);
  108.     case 1:
  109.     {
  110.         ubyte c;
  111.         fread(&c, 1, 1, fi);
  112.         return(c);
  113.     }
  114.     case 2:
  115.     {
  116.         uword c;
  117.         freadl(&c, 2, 1, fi);
  118.         return(c);
  119.     }
  120.     case 4:
  121.     {
  122.         ulong c;
  123.         freadl(&c, 4, 1, fi);
  124.         return(c);
  125.     }
  126.     default:
  127.     fseek(fi, r->ri_RelocSize, 1);
  128.     return(0);
  129.     }
  130. }
  131.  
  132.